package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.beans.factory.annotation.Autowired;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.service.RestriccionService;
import co.gov.medellin.ssti.sub.model.vo.AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.Beneficiario_AtributoVO;

public class GuardarBeneficiosAction extends Action {
	@Autowired
	RestriccionService restriccionServiceImpl;

	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 * @return
	 * @throws java.io.IOException
	 * @throws javax.servlet.ServletException
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		HttpSession session = request.getSession();
		String strBeneficiario = (String) session.getAttribute("beneficiario");
		String strCodigoSubpro = (String) session.getAttribute("CodigoSubpro");
		session.setAttribute("CodigoSubpro", strCodigoSubpro);
		String strCodigoSede = request.getParameter("code");
		session.setAttribute("CodigoSede", strCodigoSede);
		Object obtercero = (Object) request.getParameter("tercero");
		session.setAttribute("Tercero", request.getParameter("tercero"));
		session.setAttribute("CostBenefit", request.getParameter("costbene"));
		session.setAttribute("TipoBenefit", request.getParameter("tipobene"));
		session.setAttribute("codeHechoVictimizante",
				request.getParameter("codeHechoVictimizante"));

		// boolean insertar = true;
		boolean stop = true;
		// boolean activo = true;
		// int mensajes = 0;

		@SuppressWarnings("unchecked")
		List<AtributoVO> lAtributo = (List<AtributoVO>) session
				.getAttribute("ListaAtributos");
		List<String> lError = new LinkedList<String>();
		List<Beneficiario_AtributoVO> lInsertar = new LinkedList<Beneficiario_AtributoVO>();
		List<AtributoVO> lAtriNoRestric = new LinkedList<AtributoVO>();
		List<AtributoVO> lAtriAlerta = new LinkedList<AtributoVO>();
		List<Beneficiario_AtributoVO> lInsertTercero = new LinkedList<Beneficiario_AtributoVO>();

		// String CodMaxBenefOtor = "";

		int tamanolatri = lAtributo.size();

		String variable = "";
		String tipodato = "";
		// String tipoatri = "";
		// String codatri = "";
		int compara1 = 0;
		int compara2 = 0;

		// fecha del beneficio
		String strDateBenefit = (String) request.getParameter("date");
		session.setAttribute("DateBenefit", strDateBenefit);
		// Fin del proceso

		for (int j = 0; j < tamanolatri; j++) {
			AtributoVO atri = (AtributoVO) lAtributo.get(j);
			String codigo = atri.getCodatributo();
			String obtenercod = "Atri" + codigo;
			String obligacion = atri.getObligatorio();

			if (obligacion.equals("S")) {
				compara1++;
				String obCodVeri = (String) request.getParameter(obtenercod);
				if (!obCodVeri.equals("")) {
					compara2++;
				} else {
					String NomError = atri.getEtiqueta();
					lError.add(NomError);
				}
			}
		}

		// proceso para validar los campos con las restricciones
		if (compara1 == compara2) {
			// try
			// {
			if (obtercero != null) {

				for (int i = 0; i < tamanolatri; i++) {
					Beneficiario_AtributoVO objinsettercero = new Beneficiario_AtributoVO();
					AtributoVO atritercero = (AtributoVO) lAtributo.get(i);

					String strCodiAtri = atritercero.getCodatributo();
					// String strCodiRest = atritercero.getRestriccion();
					String strTipoAtri = atritercero.getTipoatributo();
					// String strNombre = atritercero.getNombre();
					tipodato = atritercero.getTipodato();
					variable = request.getParameter("Atri"
							+ atritercero.getCodatributo());

					if (strTipoAtri.equals("R")) {
						objinsettercero.setVariable(variable);
						objinsettercero.setTipodato(tipodato);
						objinsettercero.setCodigoatributo(strCodiAtri);
						objinsettercero.setCodbeneficiario(strBeneficiario);
						objinsettercero.setTipoatributo(strTipoAtri);
						lInsertar.add(objinsettercero);

					} else {
						objinsettercero.setVariable(variable);
						objinsettercero.setTipodato(tipodato);
						objinsettercero.setCodigoatributo(strCodiAtri);
						objinsettercero.setTipoatributo(strTipoAtri);
						lInsertar.add(objinsettercero);

					}

					objinsettercero.setVariable(variable);
					objinsettercero.setTipodato(tipodato);
					objinsettercero.setCodigoatributo(strCodiAtri);
					objinsettercero.setCodbeneficiario(strBeneficiario);
					objinsettercero.setTipoatributo(strTipoAtri);
					lInsertTercero.add(objinsettercero);
				}
				session.setAttribute("listatercero", lInsertTercero);

			} else {
				for (int i = 0; i < tamanolatri; i++) {
					if (stop) {
						Beneficiario_AtributoVO objBenAtriVO = new Beneficiario_AtributoVO();
						AtributoVO atrirestri = (AtributoVO) lAtributo.get(i);
						String strCodiAtri = atrirestri.getCodatributo();
						String strCodiRest = atrirestri.getRestriccion();
						String strTipoAtri = atrirestri.getTipoatributo();
						// String strNombre = atrirestri.getNombre();
						tipodato = atrirestri.getTipodato();

						if (tipodato.equals("F")) {
							String dia = request.getParameter("dia" + i);
							String mes = request.getParameter("mes" + i);
							String ano = request.getParameter("ano" + i);
							variable = dia + "/" + mes + "/" + ano;
						} else {
							variable = request.getParameter("Atri"
									+ atrirestri.getCodatributo());
						}

						if (strCodiRest != null && !strCodiRest.isEmpty()) {
							try {
								String ArrRest[] = restriccionServiceImpl
										.validarRestriccion(strCodiAtri,
												strCodiRest, variable, tipodato);
								if (ArrRest[0].equals("N")) {
									if (ArrRest[1].equals("true")) {

										session.setAttribute("mensajes", "1");

										if (strTipoAtri.equals("R")) {
											objBenAtriVO.setVariable(variable);
											objBenAtriVO.setTipodato(tipodato);
											objBenAtriVO
													.setCodigoatributo(strCodiAtri);
											objBenAtriVO
													.setCodbeneficiario(strBeneficiario);
											objBenAtriVO
													.setTipoatributo(strTipoAtri);
											lInsertar.add(objBenAtriVO);

										} else {
											objBenAtriVO.setVariable(variable);
											objBenAtriVO.setTipodato(tipodato);
											objBenAtriVO
													.setCodigoatributo(strCodiAtri);
											objBenAtriVO
													.setTipoatributo(strTipoAtri);
											lInsertar.add(objBenAtriVO);

										}
									} else {
										// insertar = false;

										session.setAttribute("mensajes", "2");
										atrirestri.setDescrest(ArrRest[2]);
										// String ver =
										// atrirestri.getDescrest();
										lAtriNoRestric.add(atrirestri);

									}
								} else {
									if (ArrRest[1].equals("false")) {
										session.setAttribute("mensajes", "3");
										atrirestri.setDescrest(ArrRest[2]);
										lAtriAlerta.add(atrirestri);

									}
									if (strTipoAtri.equals("R")) {
										objBenAtriVO.setVariable(variable);
										objBenAtriVO.setTipodato(tipodato);
										objBenAtriVO
												.setCodigoatributo(strCodiAtri);
										objBenAtriVO
												.setCodbeneficiario(strBeneficiario);
										objBenAtriVO
												.setTipoatributo(strTipoAtri);
										lInsertar.add(objBenAtriVO);
									} else {
										objBenAtriVO.setVariable(variable);
										objBenAtriVO.setTipodato(tipodato);
										objBenAtriVO
												.setCodigoatributo(strCodiAtri);
										objBenAtriVO
												.setTipoatributo(strTipoAtri);
										lInsertar.add(objBenAtriVO);
									}
								}
							} catch (DAOException e) {
								SUBException.logDebugError("", e);
							}
						} else {
							if (strTipoAtri.equals("R")) {
								objBenAtriVO.setVariable(variable);
								objBenAtriVO.setTipodato(tipodato);
								objBenAtriVO.setCodigoatributo(strCodiAtri);
								objBenAtriVO
										.setCodbeneficiario(strBeneficiario);
								objBenAtriVO.setTipoatributo(strTipoAtri);
								lInsertar.add(objBenAtriVO);
							} else {
								objBenAtriVO.setVariable(variable);
								objBenAtriVO.setTipodato(tipodato);
								objBenAtriVO.setCodigoatributo(strCodiAtri);
								objBenAtriVO.setTipoatributo(strTipoAtri);
								lInsertar.add(objBenAtriVO);
							}
						}
					}
				}
			}

			if (lAtriNoRestric.size() > 0) {
				session.setAttribute("listanorestric", lAtriNoRestric);
			} else {
				session.removeAttribute("listanorestric");
			}

			if (lAtriAlerta.size() > 0) {
				session.setAttribute("listaalerta", lAtriAlerta);
			} else {
				session.removeAttribute("listaalerta");
			}
			session.setAttribute("mensaje", "1");
			session.setAttribute("listainsetar", lInsertar);

			// }catch(SQLException e){
			// e.printStackTrace();
			// }
		} else {

			// String Error = "Error";
			int tama = lError.size();
			String strTamaError = String.valueOf(tama);
			if (lAtriNoRestric.size() > 0) {
				session.setAttribute("listanorestric", lAtriNoRestric);
			} else {
				session.removeAttribute("listanorestric");
			}

			if (lAtriAlerta.size() > 0) {
				session.setAttribute("listaalerta", lAtriAlerta);
			} else {
				session.removeAttribute("listaalerta");
			}
			session.setAttribute("ListaErrores", lError);
			session.setAttribute("tamanoError", strTamaError);
			session.setAttribute("mensaje", "2");
		}
		if ((lAtriAlerta.size() > 0) || (lAtriNoRestric.size() > 0)
				|| lError.size() > 0) {
			return mapping.findForward("success");
		} else {
			return mapping.findForward("ver");
		}

	}
}